home *** CD-ROM | disk | FTP | other *** search
/ Ray Dream Studio / Ray Dream Studio (CDRAYD1) (Ray Dream) (1995).iso / DREAMSDK.WIN / INCLUDE / RDLIST.H < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-21  |  3.0 KB  |  100 lines  |  [TEXT/mdos]

  1. /* $Id: rdlist.h 1.26 1995/04/03 19:26:16 JOHN Exp $ */
  2. /*$RDGNU$*/
  3. #ifndef __RDLIST__
  4. #define __RDLIST__
  5.  
  6. #ifndef __MTYPES__
  7. #include "MTypes.h"
  8. #endif
  9.  
  10. typedef long RDlistIndex;
  11. typedef void(*ForEachDataProc)(void *data,void *param);
  12.  
  13. class RDList {
  14. public:
  15.     enum {kUnusedIndex=0, kBlockSize=10};
  16.     RDList() {fAllocSize=0;fData=0;fSize=0;}
  17.     ~RDList();
  18.     RDList* Clone();
  19.     RDList* Clone(void *(*howTo)(void*));
  20.     void FreeAll(void(*howTo)(void*));
  21.     void FreeElement(void(*howTo)(void*) , long i);
  22.     void Delete(long i);  //Does not free item
  23.     void DeleteAll();  //Does not free item 
  24.     void DeleteAllThat(Boolean (*doRemove)(void*, void*), void* staticLink); //Does not free items
  25.     void DeleteFirstThat(Boolean (*doRemove)(void*, void*), void* staticLink); //Does not free items
  26.     long GetEqualItemNo(void* item);
  27.     void* First();
  28.     void* Last();         
  29.     void InsertFirst(void* item) {InsertBefore(1, item);}
  30.     void InsertLast(void* item) {if (fSize==fAllocSize) MakeDataLarger();fData[fSize++]=item;}
  31.     void AtPut(long index, void* item) {fData[index-1] = item;} //Does not free old item
  32.     long GetSize() const {return(fSize);}
  33.     void* At(long i) const {return fData[i-1];}
  34.     void* AtCheckedOrZero(long i) const;
  35.     void InsertBefore(long i, void* item);
  36.     void InsertAfter(long i, void* item);
  37.     void CopyItems(RDList* fromList, long firstIndex, long nbItems, long insertIndex);
  38.     void Each(void(*DoToItem)(void*, void*) , void* staticLink) const;
  39.     void* FirstThat(unsigned char(*TestItem)(void*, void*) , void* staticLink);
  40.     void PreAllocate(long size);
  41.  
  42.     // Aliasing
  43.     void* GetFirst() const;
  44.     void* GetLast() const;
  45.     void EnQueue(void* item);
  46.     void EnQueueFirst(void* item);
  47.     void* DeQueue();
  48.     void Remove(void* item);
  49.     void FreeData(void(*howTo)(void*)); // same as FreeAll()
  50.     long GetIdentityItemNo(void* item); // same as GetEqualItemNo()
  51.     void DeleteElementsAt(long i, long nb = 1);
  52.     void    Clear() {DeleteAll();}
  53. protected:
  54.     void** fData;
  55.     long fSize;
  56.     long fAllocSize;
  57.     void MakeDataLarger();    
  58. private:
  59.     friend class RDListIterator;
  60.     friend class RDListReverseIterator;
  61.     };
  62.  
  63. class RDListIterator {
  64. public:
  65.     RDListIterator(const RDList* list) {fList=list;fIndex=1;fCurrent=fList->fData;}
  66.     void Reset() {fIndex=1;fCurrent=fList->fData;}
  67.     void* First() {fIndex=1;fCurrent=fList->fData;return (fList->fSize?*fCurrent:NULL);}
  68.     void* Next() {return (++fIndex<=fList->fSize?*(++fCurrent):NULL);}
  69.     Boolean More() {return (fIndex<=fList->fSize);}
  70.     long GetIndex() {return fIndex;}
  71. protected:
  72.     const RDList* fList;
  73.     void** fCurrent;
  74.     long fIndex;
  75.     };
  76.  
  77. class RDListReverseIterator {
  78. public:
  79.     RDListReverseIterator(RDList* list,Boolean reversed,void* start); 
  80.     void Reset();
  81.     void* First();
  82.     void* Next();
  83.     Boolean More();
  84.     long GetIndex() {return fIndex;}
  85. protected:
  86.     RDList* fList;
  87.     void** fCurrent;
  88.     long fIndex;
  89.   Boolean fReversed;
  90.     void* fStart;
  91.     };
  92.     
  93. class RDStack: private RDList {
  94. public:
  95.     void Push(void* obj);
  96.     void* Pop();
  97.     };
  98.  
  99. #endif  
  100.